iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

要部署資源到 Kubernetes 中,最困難的是一開始,因為要定義複雜又要排版的 YAML。但之後通常只需要進行較小的更改,例如更新容器 Image 版本、副本數或新的配置值。一種方法是直接修改原始 YAML 檔案進行變更,但這也讓錯誤可能性提高,任何錯誤,例如修改錯誤的位置、不小心刪除內容、輸入錯誤的空白這些都可能造成災難性的後果。而 Kustomize 可用來設定更改更頻繁的參數。其可以降低配置錯誤的範圍。

安裝

curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash

接下來一步一步來完轉它。

預設上寫好了 Kubernetes 資源。

/day16/helmchartlab/kubernetes$ tree .
.
├── configmap.yaml
├── deployment.yaml
├── service.yaml
└── serviceaccount.yaml
  1. 建立 kustomization 檔案

kustomization 檔案應該聲明要部署至 Kubernete 上的資源,以及要應用於它們的任何自定義,例如添加一個通用標籤(Label)等。以下面範例定義了共用 Label、Annotation。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources: # 要管理的資源
- configmap.yaml
- deployment.yaml
- service.yaml
- serviceaccount.yaml
namespace: day19
buildMetadata: 
  - managedByLabel
labels:
  app.kubernetes.io/name: quarkus-dns
  app.kubernetes.io/version: day16
commonAnnotations:
    app.quarkus.io/quarkus-version: 3.14.2
    app.quarkus.io/createded-by: quarkus
images:
- name: registry.hub.docker.com/cch0124/quarkus-dns
  newName: registry.hub.docker.com/cch0124/quarkus-dns
  newTag: day16
namePrefix: cch-
replicas:
- name: quarkus-dns
  count: 1

新增後資料結構如下

ithome2024lab/day16/helmchartlab/kubernetes$ tree .
.
├── configmap.yaml
├── deployment.yaml
├── kustomization.yaml
├── service.yaml
└── serviceaccount.yaml

0 directories, 5 files

配置好後,可以使用 kustomize build 產生自訂 YAML。如果正確是可以直接部署。

ithome2024lab/day16/helmchartlab/kubernetes$ kustomize build .

或是使用

$  kubectl apply --dry-run=client -o yaml -k ./

另外,在 resources 欄位中,除了直接設置 YAML 檔案之外,還支援不同的輸入。例如,可以設置一個包含其自己的 kustomization.yaml 和 Kubernetes 資源檔案的 base 目錄,並從另一個放置在另一個目錄中的 kustomization.yaml 檔案中引用它。抑或著參考遠方儲存庫上的 kustomization。

.
 ├── base
 │   ├── kustomization.yaml
 │   └── deployment.yaml
 ├── kustomization.yaml
 ├── configmap.yaml
#base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
 resources:
 - deployment.yaml
#kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
 kind: Kustomization
resources:
- ./base
- ./configmap.yaml

關鍵概念

  1. Base

是包含 kustomization.yaml 檔案的目錄,其中包含一組資源及其相關的自訂。它可以是本地目錄或來自遠端倉庫的目錄,只要其中存在 kustomization.yaml 檔案即可。

  1. Overlays

也是一個目錄,其中包含將其他 kustomization 目錄當做 bases 來引用的 kustomization.yaml 檔案。Base 會不了解 Overlays 的存在,且可被多個 Overlays 所使用。它可以有多個 Base 來源,且可針對所有 Base 中的資源執行組織操作,也可以在其上執行自訂。因此 Overlays 應用於不同場景的配置。

下面的操作將基於此概念來演示。因此目錄結構是

ithome2024lab/day16/helmchartlab/kustomize$ tree .
.
├── base
│   ├── configmap.yaml
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   ├── service.yaml
│   └── serviceaccount.yaml
└── overlays
    ├── dev
    │   └── kustomization.yaml
    └── prd

4 directories, 6 files

用 Kustomize 更新 Container Image

使用 images 的關鍵字,進行配置,上述為

#overlays/dev/kustomization.yaml
images: 
- name: registry.hub.docker.com/cch0124/quarkus-dns # 設定要更新的 Image 名稱
  newName: registry.hub.docker.com/cch0124/quarkus-dns
  newTag: day19-dev # 給 Image 的新版本

Image 更新,在當今軟體開發中是最常用的操作之一,即將應用程式更新到較新的版本,無論是為了修復錯誤還是添加新功能。在 Kubernetes 中,這需要創建一個新的容器 Image,並使用標籤。

使用指令 kustomize edit set image <IMAGE>:<TAG> 也是可行的。

用 Kustomize 更新 Kubernetes 資源欄位

方法上是使用 patch 透過 JsonPath 規範指定欄位上變更。如下針對 revisionHistoryLimit 進行變動。

#kustomize/overlays/dev/kustomization.yaml
...
patches: 
  - target: # 部分設定需要更改哪個 Kubernetes 物件。這些值與先前建立的部署檔案相符。
      version: v1
      group: apps
      kind: Deployment
      name: quarkus-dns
    patch: |- # Patch 表達式
      - op: replace # 修改的操作
        path: /spec/revisionHistoryLimit # 要修改的欄位的路徑
        value: 3 # 新的值
      - op: add 
        path: /metadata/labels/enviroment
        value: dev

透過以下讀者可以驗證,預設上設定 5,但至 dev 會變成 3。

/day16/helmchartlab/kustomize/overlays/dev$ kustomize build .

上面看到 op 欄位除了 replace 還可以 add 或是 delete。但是如果對於較複雜的嵌套可以定義一個 YAML 來引用。如下

定義一個要進行修改 YAML 到最後狀態的內容,下面是一個新稱 TEST 環境變數的內容

#deployment-resource-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: quarkus-dns
spec:
  template:
    spec:
      containers:
        - name: quarkus-dns
          env:
            - name: TEST
              value: "TEST"

在下面的 kustomization.yaml 使用 path: deployment-resource-patch.yaml 來引用。

#kustomize/overlays/dev/kustomization.yaml
patches: 
  - target: 
      version: v1
      group: apps
      kind: Deployment
      name: quarkus-dns
    patch: |- 
      - op: replace 
        path: /spec/revisionHistoryLimit
        value: 3
      - op: add 
        path: /metadata/labels/enviroment
        value: dev
  - path: deployment-resource-patch.yaml # 外部補丁檔案路徑

到這邊基本上都完成了操作可能。因此到這邊基本上就可以部署資源至 Kubernetes 中。

在 Kustomize 產生 ConfigMaps

可使用 ConfigMapGenerator 功能動態產生 Kubernetes ConfigMap 資源。ConfigMapGenerator 會自動將雜湊添加到 ConfigMap 的元數據名稱,並修改部署檔案以包含新的雜湊。這項微小的更改對應用程式的生命週期具有深遠的影響。這影響會是前面討論 hot-reload 部分,一般來說 ConfigMap 資源異動並不會讓應用程式獲取最新的內容。如果 ConfigMapGenerator 管理 ConfigMap,則配置檔案上的任何更改也會更改部署 Kubernetes 資源。由於部署檔案也已更改,因此在應用資源時會觸發自動滾動更新。

#kustomize/overlays/dev/kustomization.yaml
...
configMapGenerator:
- name: quarkus-dns-config
  behavior: replace # 建立測行為。可以是 create、replace 和 merge
  files: # 設定要讀取的檔案
    - ./application.yaml

當然 files 這是其一個使用範例,還可以使用 literals 等方法。更多方是可參閱官方

到這邊也知道了 kustomize 這個工具。相較於 Helm Chart 兩者是不衝突的東西,但是需要更彈性的設計會選擇 Helm,不過相對的複雜語法會使你頭痛,但 kustomize 沒有 hook 和 release management 的概念,相對於簡單以及容易。

總而言之,下方的圖代表了 kustomize,使用 patch 方式將一個完整的 YAML 資源呈現出來。

參考資源


上一篇
給 Helm Chart 一些外衣
下一篇
八腳章魚 Argo CD
系列文
當 Quarkus 想要騎乘駱駝並用8腳章魚掌控舵手 31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言